#getting-started

Welcome! This guide gets you from zero to productive with SilverBullet in about five minutes.

1. Install and run

The fastest way to get started is with Docker:

docker run -p 3000:3000 -v ./space:/space ghcr.io/silverbulletmd/silverbullet

Or download the Install/Binary|single binary and run it:

silverbullet ./space

Now open http://localhost:3000 in your browser.

note Tip For a full breakdown of installation options, see Install.

2. Create your first page

Click the page icon in the Top Bar (or press Cmd-k / Ctrl-k) to open the Page Picker. Type a page name like "My First Page" and press Enter — SilverBullet creates it instantly.

Start typing. Everything is Markdown.

3. Link pages together

Type [ to link to another page. SilverBullet autocompletes page names for you. Links are bi-directional: the linked page will show a [Linked Mention back to the page you're writing.

4. Add some structure

Tag a page by adding a hashtag on an empty line (see Markdown/Hashtags#Scope rules), for instance #project. Or add structured data using Frontmatter at the top of a page:

---
status: active
priority: high
tags: project
---

These attributes become queryable, which we’re going to do next.

5. Run your first queries

Pages in SilverBullet can use Space Lua and Space Lua/Lua Integrated Query feature specifically to dynamically generate content. Add this to any page:

${query[from tags.page limit 5](from tags.page limit 5)}

As you move your mouse cursor outside this code fragment, it renders a live table of your pages, right inline. Queries update as your space changes dynamically.

Now, let’s write a query that finds all your pages tagged with #project (as done in the previous step) filtered on only high priority ones:

${query[from p = tags.project where p.priority == "high"](from p = tags.project where p.priority == "high")}

6. Use a template to customize query rendering

By default, queries are rendered as tables, however you can render them in other ways as well. SilverBullet comes with a set of pre-defined ^Library/Std/Infrastructure/Query Templates you can use, for instance:

# High qriority projects
${template.each(query[
  from p = tags.project
  where p.priority == "high"
  order by p.lastModified desc
](
  from p = tags.project
  where p.priority == "high"
  order by p.lastModified desc
), templates.pageItem)}

This renders your 5 most recently updated high-priority projects as a bulleted list (an item in SilverBullet parlance).

Of course, you can also create custom templates. Either as reusable Lua functions, or inline:

# High qriority projects
${template.each(query[
  from p = tags.project
  where p.priority == "high"
  order by p.lastModified desc
](
  from p = tags.project
  where p.priority == "high"
  order by p.lastModified desc
), template.new[==[
    * ${name} (status: ${status})
]==])}

What's next?

Now that you know the basics, explore these guides for real-world workflows: